package org.jsola.contract.service;

import org.jsola.contract.dao.ISealDAO;
import org.jsola.contract.dto.IssuedSealAddDTO;
import org.jsola.contract.dto.SealAddDTO;
import org.jsola.contract.dto.SealUpdateDTO;
import org.jsola.contract.entity.SealDO;
import org.jsola.contract.query.SealQuery;
import org.jsola.contract.vo.SealListVO;
import org.jsola.contract.vo.SealVO;
import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.user.core.TokenUser;

import java.util.List;


/**
 * 印章
 *
 * @author JanusMix
 */
public interface ISealService extends IService<ISealDAO, SealDO> {

    /**
     * 新增印章
     *
     * @param sealAddDTO 新增印章DTO
     * @param tokenUser  当前用户
     * @return 印章详情信息
     */
    SealVO save(SealAddDTO sealAddDTO, TokenUser tokenUser);

    /**
     * 批量新增印章
     *
     * @param sealAddDTOList 新增印章DTO
     * @param tokenUser      当前用户
     * @return 印章详情信息
     */
    List<SealVO> batchSave(List<SealAddDTO> sealAddDTOList, TokenUser tokenUser);

    /**
     * 修改印章
     *
     * @param sealUpdateDTO 修改印章DTO
     * @param tokenUser     当前用户
     * @return 更新数量
     */
    int update(SealUpdateDTO sealUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除印章，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser 当前用户
     * @param sealIds   印章id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, Long... sealIds);

    /**
     * 根据印章id查找
     *
     * @param sealId 印章id
     * @param siteId 所属站点id
     * @return 印章详情信息
     */
    SealVO selectById(Long sealId, String siteId);

    /**
     * 根据印章idList查找印章
     *
     * @param sealIds 印章id列表
     * @param siteId  所属站点id
     * @return 印章详情信息
     */
    List<SealDO> selectByIds(List<Long> sealIds, String siteId);

    /**
     * 查询印章
     *
     * @param sealQuery 查询条件
     * @param siteId    所属站点id
     * @return 印章列表信息
     */
    List<SealListVO> select(SealQuery sealQuery, String siteId);

    /**
     * 查询业务所属的所有印章
     *
     * @param subjectId 业务id
     * @param siteId    所属站点id
     * @return 印章列表信息
     */
    List<SealDO> selectBySubjectId(String subjectId, String siteId);

    /**
     * 查询印章记录数
     *
     * @param sealQuery 查询条件
     * @param siteId    所属站点id
     * @return 印章记录数
     */
    int selectCount(SealQuery sealQuery, String siteId);

    /**
     * 分页查询印章
     *
     * @param sealQuery 查询条件
     * @param siteId    所属站点id
     * @return 印章列表信息
     */
    Page<SealListVO> selectPage(SealQuery sealQuery, String siteId);


    /**
     * 根据印章id查找
     *
     * @param sealId 印章id
     * @param siteId 所属站点id
     * @return 印章
     */
    SealDO selectDOById(Long sealId, String siteId);

    /**
     * 查询印章
     *
     * @param sealQuery 查询条件
     * @param siteId    所属站点id
     * @return 印章列表
     */
    List<SealDO> selectDO(SealQuery sealQuery, String siteId);


    /**
     * 下发印章到公司
     *
     * @param issuedSealAddDTO 印章
     * @param tokenUser        登录用户
     * @return 印章
     */
    List<SealVO> saveIssuedSeal(IssuedSealAddDTO issuedSealAddDTO, TokenUser tokenUser);

    /**
     * 查询用工单位下指定名称印章
     *
     * @param subjectIds 业务id(目前指公司id)
     * @param sealNames  印章名称
     * @return 印章信息
     */
    List<SealDO> selectBySubjectIdsAndNames(List<String> subjectIds, List<String> sealNames, TokenUser tokenUser);
}


